#pragma once
#include "Singleton.hpp"
#include "fileTree.h"
#include <fstream>
#include <cstring>

#pragma pack(1) // 禁止结构体对齐优化
// 初始化超级块
struct Superblock {
    uint32_t magic;
    uint32_t block_size; // 块大小
    uint32_t total_blocks; // 总块数
    uint32_t inode_count; // inode 数量
    uint32_t free_blocks; // 总数据块 = 总块数 - 超级块 - inode 表 - 位图块
};

struct Inode {
    uint32_t mode{0};       // 文件类型和权限
    uint32_t size{0};       // 文件大小（字节）如果是目录，则为子目录数量
    uint32_t blocks[12]{0}; // 直接指针（假设块大小4KB，可存48KB文件）
    uint32_t indirect{0};   // 间接指针块
};

//目录存储时使用数组的形式，第一个未父目录第二个为自己，剩下的是子目录与文件
struct DirEntry {
    uint32_t inode;    // 子文件/目录的 inode 号
    char name[256];    // 文件名（含终止符）
};
#pragma pack() // 恢复默认对齐

class IOControlLayer : public Singleton<IOControlLayer> {
    friend class Singleton<IOControlLayer>;
public:
    void create_disk_image(const std::string &filename);
    void read_disk_image(const std::string &filename);
    uint32_t leisure_inode_chunk();
    uint32_t leisure_data_chunk();
    uint32_t create_dir(const std::string &path, uint32_t parent_inode, const std::string &name);
    uint32_t create_file(const std::string&, uint32_t, const std::string&, const std::string&);
    std::string read_file(uint32_t inode);

private:


private:
    const uint32_t BLOCK_SIZE = 4096; // 4KB/块
    const uint32_t TOTAL_BLOCKS = 1024; // 4MB 虚拟磁盘
    char *leisure_chunk;
    Superblock superblock;
    std::fstream disk;


protected:
    IOControlLayer();
    ~IOControlLayer();
};